package com.bjc.chapter13;



/**
 * 如何保证变量s只想的是字符串常量池中的数据呢
 * 有两种方式：
 * 方式一：String s = "abc"; //字面量定义的方式
 * 方式二：调用intern()方法
 * String s = new String("abc").intern();
 * String s = new StringBuilder("abc").intern();
 */
public class StringIntern {

    public static void main(String[] args) {
//        String s = new String("a");

        String s1 = new String("1");
        //调用此方法之前，字符串常量池中已经存在了 "1"
        s1.intern();
        String s2 = "1";
        System.out.println(s1 == s2); //jkd6: false   jdk7/8: false


        //s3变量记录的地址为 new String("11")
        String s3 = new String("1") + new String("1");
        //执行完上一行代码后，字符串常量池中，不存在"11"常量
        //s3.intern()在字符串常量池中生成"11"，如果理解： jdk6创建了一个新的对象"11" 也就有新的地址
        //                                          jdk7/8中 此时常量中并没有创建"11" 而是创建一个指向new String("11")的地址
        s3.intern();
        //s4变量记录的地址，使用的是上一行代码执行时，在常量池中生成的"11"的地址
        String s4 = "11";
        System.out.println(s3 == s4);//jkd6: false   jdk7/8: true
    }
}
